import { replaceHtml } from '../utils/util'
import formula from '../global/formula'
import { isRealNum, isRealNull } from '../global/validate'
import { isdatetime, diff } from '../global/datecontroll'
import { luckysheetrefreshgrid } from '../global/refresh'
import tooltip from '../global/tooltip'
import { setcellvalue } from '../global/setdata'
import { getcellvalue } from '../global/getdata'
import editor from '../global/editor'
import { modelHTML } from './constant'
import { selectionCopyShow } from './select'
import server from './server'
import menuButton from './menuButton'
import sheetmanage from './sheetmanage'
import { getSheetIndex, getRangetxt } from '../methods/get'
import locale from '../locale/locale'
import Store from '../store'
import $ from 'jquery'

const dataVerificationCtrl = {
    defaultItem: {
        type: 'dropdown',  //类型
        type2: null,  //
        value1: '',  //
        value2: '',  //
        checked: false,
        remote: false,  //自动远程获取选项
        prohibitInput: false,  //输入数据无效时禁止输入
        hintShow: false,  //选中单元格时显示提示语
        hintText: '',  //
    },
    curItem: null,
    dataVerification: null,
    selectRange: [],
    selectStatus: false,
    optionLabel: {
        'number': '数值',
        'number_integer': '整数',
        'number_decimal': '小数',
        'bw': '介于',
        'nb': '不介于',
        'eq': '等于',
        'ne': '不等于',
        'gt': '大于',
        'lt': '小于',
        'gte': '大于等于',
        'lte': '小于等于',
        'include': '包括',
        'exclude': '不包括',
        'equal': '等于',
        'bf': '早于',
        'nbf': '不早于',
        'af': '晚于',
        'naf': '不晚于',
        'card': '身份证号码',
        'phone': '手机号'
    },
    optionLabel_en: {
        'number': 'numeric',
        'number_integer': 'integer',
        'number_decimal': 'decimal',
        'bw': 'between',
        'nb': 'not between',
        'eq': 'equal to',
        'ne': 'not equal to',
        'gt': 'greater',
        'lt': 'less than',
        'gte': 'greater or equal to',
        'lte': 'less than or equal to',
        'include': 'include',
        'exclude': 'not include',
        'equal': 'equal to',
        'bf': 'earlier than',
        'nbf': 'not earlier than',
        'af': 'later than',
        'naf': 'not later than',
        'card': 'identification number',
        'phone': 'phone number'
    },
    createDialog: function(){
        let _this = this

        const _locale = locale()
        const dvText = _locale.dataVerification
        const toolbarText = _locale.toolbar
        const buttonText = _locale.button

        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-dataVerification-dialog').remove()

        let content =  `<div class="box">
                            <div class="box-item" style="border-top:1px solid #E1E4E8;">
                                <div class="box-item-title">${dvText.cellRange}</div>
                                <div id="data-verification-range" class="range">
                                    <input class="formulaInputFocus" spellcheck="false">
                                    <i class="fa fa-table" aria-hidden="true" title="${dvText.selectCellRange}"></i>
                                </div>
                            </div>
                            <div class="box-item">
                                <div class="box-item-title">${dvText.verificationCondition}</div>
                                <select id="data-verification-type-select">
                                    <option value="dropdown">${dvText.dropdown}</option>
                                    <option value="checkbox">${dvText.checkbox}</option>
                                    <option value="number">${dvText.number}</option>
                                    <option value="number_integer">${dvText.number_integer}</option>
                                    <option value="number_decimal">${dvText.number_decimal}</option>
                                    <option value="text_content">${dvText.text_content}</option>
                                    <option value="text_length">${dvText.text_length}</option>
                                    <option value="date">${dvText.date}</option>
                                    <option value="validity">${dvText.validity}</option>
                                </select>
                                <div class="show-box">
                                    <div class="show-box-item show-box-item-dropdown">
                                        <div class="range">
                                            <input class="formulaInputFocus data-verification-value1" placeholder="${dvText.placeholder1}" spellcheck="false">
                                            <i class="fa fa-table" aria-hidden="true" title="${dvText.selectCellRange}"></i>
                                        </div>
                                        <div class="multi">
                                            <input type="checkbox" id="data-verification-multi" class="data-verification-multi">
                                            <label for="data-verification-multi">${dvText.allowMultiSelect}</label>
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-checkbox">
                                        <div class="check-box">
                                            <span>${dvText.selected} ——</span>
                                            <input type="text" class="data-verification-value1" placeholder="${dvText.placeholder2}">
                                        </div>
                                        <div class="check-box">
                                            <span>${dvText.notSelected} ——</span>
                                            <input type="text" class="data-verification-value2" placeholder="${dvText.placeholder2}">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-number">
                                        <select id="data-verification-number-select">
                                            <option value="bw">${dvText.between}</option>
                                            <option value="nb">${dvText.notBetween}</option>
                                            <option value="eq">${dvText.equal}</option>
                                            <option value="ne">${dvText.notEqualTo}</option>
                                            <option value="gt">${dvText.moreThanThe}</option>
                                            <option value="lt">${dvText.lessThan}</option>
                                            <option value="gte">${dvText.greaterOrEqualTo}</option>
                                            <option value="lte">${dvText.lessThanOrEqualTo}</option>
                                        </select>
                                        <div class="input input1">
                                            <input type="number" class="data-verification-value1" placeholder="1">
                                            <span>-</span>
                                            <input type="number" class="data-verification-value2" placeholder="100">
                                        </div>
                                        <div class="input input2">
                                            <input type="number" class="data-verification-value1" placeholder="${dvText.placeholder3}">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-text">
                                        <select id="data-verification-text-select">
                                            <option value="include">${dvText.include}</option>
                                            <option value="exclude">${dvText.exclude}</option>
                                            <option value="equal">${dvText.equal}</option>
                                        </select>
                                        <div class="input input2">
                                            <input type="text" class="data-verification-value1" placeholder="${dvText.placeholder4}"/>
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-textLength">
                                        <select id="data-verification-textLength-select">
                                            <option value="bw">${dvText.between}</option>
                                            <option value="nb">${dvText.notBetween}</option>
                                            <option value="eq">${dvText.equal}</option>
                                            <option value="ne">${dvText.notEqualTo}</option>
                                            <option value="gt">${dvText.moreThanThe}</option>
                                            <option value="lt">${dvText.lessThan}</option>
                                            <option value="gte">${dvText.greaterOrEqualTo}</option>
                                            <option value="lte">${dvText.lessThanOrEqualTo}</option>
                                        </select>
                                        <div class="input input1">
                                            <input type="number" class="data-verification-value1" placeholder="1">
                                            <span>-</span>
                                            <input type="number" class="data-verification-value2" placeholder="100">
                                        </div>
                                        <div class="input input2">
                                            <input type="number" class="data-verification-value1" placeholder="${dvText.placeholder3}">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-date">
                                        <select id="data-verification-date-select">
                                            <option value="bw">${dvText.between}</option>
                                            <option value="nb">${dvText.notBetween}</option>
                                            <option value="eq">${dvText.equal}</option>
                                            <option value="ne">${dvText.notEqualTo}</option>
                                            <option value="bf">${dvText.earlierThan}</option>
                                            <option value="nbf">${dvText.noEarlierThan}</option>
                                            <option value="af">${dvText.laterThan}</option>
                                            <option value="naf">${dvText.noLaterThan}</option>
                                        </select>
                                        <div class="input input1">
                                            <input type="date" class="data-verification-value1" placeholder="2020/9/10">
                                            <span>-</span>
                                            <input type="date" class="data-verification-value2" placeholder="2020/9/10">
                                        </div>
                                        <div class="input input2">
                                            <input type="date" class="data-verification-value1" placeholder="2020/9/10">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-validity">
                                        <select id="data-verification-validity-select">
                                            <option value="card">${dvText.identificationNumber}</option>
                                            <option value="phone">${dvText.phoneNumber}</option>
                                        </select>
                                    </div>
                                </div>
                            </div>
                            <div class="box-item">
                                <div class="check">
                                    <input type="checkbox" id="data-verification-remote" class="data-verification-remote">
                                    <label for="data-verification-remote">${dvText.remote}</label>
                                </div>
                                <div class="check">
                                    <input type="checkbox" id="data-verification-prohibitInput">
                                    <label for="data-verification-prohibitInput">${dvText.prohibitInput}</label>
                                </div>
                                <div class="check">
                                    <input type="checkbox" id="data-verification-hint-show">
                                    <label for="data-verification-hint-show">${dvText.hintShow}</label>
                                </div>
                                <div class="data-verification-hint-text">
                                    <input type="text" placeholder="${dvText.placeholder5}">
                                </div>
                            </div>
                        </div>`

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-dataVerification-dialog',
            'addclass': 'luckysheet-dataVerification-dialog',
            'title': toolbarText.dataVerification,
            'content': content,
            'botton':  `<button id="luckysheet-dataVerification-dialog-confirm" class="btn btn-primary">${buttonText.confirm}</button>
                        <button id="luckysheet-dataVerification-dialog-delete" class="btn btn-default">${dvText.deleteVerification}</button>
                        <button class="btn btn-default luckysheet-model-close-btn">${buttonText.cancel}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-dataVerification-dialog').find('.luckysheet-modal-dialog-content').css('min-width', 350).end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(),
            winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(),
            scrollTop = $(document).scrollTop()
        $('#luckysheet-dataVerification-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()

        _this.dataAllocation()
    },
    init: function(){
        let _this = this

        const dvText = locale().dataVerification

        //单元格数据验证 类型是 下拉列表
        $(document).off('click.dropdownBtn').on('click.dropdownBtn', '#luckysheet-dataVerification-dropdown-btn', function(e) {
            _this.dropdownListShow()
            e.stopPropagation()
        })
        $(document).off('click.dropdownListItem').on('click.dropdownListItem', '#luckysheet-dataVerification-dropdown-List .dropdown-List-item', function(e) {
            var $item = $(this)
            let value = e.target.innerText
            if ($item.hasClass('multi')) {
                $item.toggleClass('checked')
                value = $.map($('#luckysheet-dataVerification-dropdown-List').children().filter('.checked'), function(el) {
                    return el.innerText
                }).join(',')
            } else {
                $('#luckysheet-dataVerification-dropdown-List').hide()
            }
            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
            let rowIndex = last.row_focus
            let colIndex = last.column_focus

            $('#luckysheet-rich-text-editor').text(value)
            formula.updatecell(rowIndex, colIndex)

            e.stopPropagation()
        })

        //单元格范围
        $(document).off('click.dvRange').on('click.dvRange', '#data-verification-range .fa-table', function(e) {
            $('#luckysheet-dataVerification-dialog').hide()

            let dataSource = '0'
            let txt = $(this).siblings('input').val().trim()

            _this.rangeDialog(dataSource, txt)

            _this.selectRange = []

            let range = _this.getRangeByTxt(txt)

            formula.rangetosheet = Store.currentSheetIndex

            if(range[0].sheetIndex != Store.currentSheetIndex){
                sheetmanage.changeSheetExec(range[0].sheetIndex)
            }

            if(range.length > 0){
                for(let s = 0; s < range.length; s++){
                    let r1 = range[s].row[0], r2 = range[s].row[1]
                    let c1 = range[s].column[0], c2 = range[s].column[1]

                    let row = Store.visibledatarow[r2],
                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                    let col = Store.visibledatacolumn[c2],
                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                    _this.selectRange.push({
                        'left': col_pre,
                        'width': col - col_pre - 1,
                        'top': row_pre,
                        'height': row - row_pre - 1,
                        'left_move': col_pre,
                        'width_move': col - col_pre - 1,
                        'top_move': row_pre,
                        'height_move': row - row_pre - 1,
                        'row': [r1, r2],
                        'column': [c1, c2],
                        'row_focus': r1,
                        'column_focus': c1
                    })
                }
            }

            selectionCopyShow(_this.selectRange)
        })
        $(document).off('click.dvRange2').on('click.dvRange2', '#luckysheet-dataVerification-dialog .show-box-item-dropdown .range .fa-table', function(e) {
            $('#luckysheet-dataVerification-dialog').hide()

            let dataSource = '1'
            let txt = $(this).siblings('input').val().trim()

            _this.rangeDialog(dataSource, txt)

            _this.selectRange = []

            let range = _this.getRangeByTxt(txt)

            formula.rangetosheet = Store.currentSheetIndex

            if(range[0].sheetIndex != Store.currentSheetIndex){
                sheetmanage.changeSheetExec(range[0].sheetIndex)
            }

            if(range.length > 0){
                for(let s = 0; s < range.length; s++){
                    let r1 = range[s].row[0], r2 = range[s].row[1]
                    let c1 = range[s].column[0], c2 = range[s].column[1]

                    let row = Store.visibledatarow[r2],
                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                    let col = Store.visibledatacolumn[c2],
                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                    _this.selectRange.push({
                        'left': col_pre,
                        'width': col - col_pre - 1,
                        'top': row_pre,
                        'height': row - row_pre - 1,
                        'left_move': col_pre,
                        'width_move': col - col_pre - 1,
                        'top_move': row_pre,
                        'height_move': row - row_pre - 1,
                        'row': [r1, r2],
                        'column': [c1, c2],
                        'row_focus': r1,
                        'column_focus': c1
                    })
                }
            }

            selectionCopyShow(_this.selectRange)
        })
        $(document).off('click.dvRangeConfirm').on('click.dvRangeConfirm', '#luckysheet-dataVerificationRange-dialog-confirm', function(e) {
            let dataSource = $(this).attr('data-source')
            let txt = $(this).parents('#luckysheet-dataVerificationRange-dialog').find('input').val()

            if(_this.getRangeByTxt(txt).length > 1){
                tooltip.info('<i class="fa fa-exclamation-triangle"></i>', '不能对多重选择区域执行此操作，请选择单个区域，然后再试')
                return
            }

            if(dataSource == '0'){
                $('#luckysheet-dataVerification-dialog #data-verification-range input').val(txt)
            }
            else if(dataSource == '1'){
                $('#luckysheet-dataVerification-dialog .show-box-item-dropdown .range input').val(txt)
            }

            $('#luckysheet-dataVerificationRange-dialog').hide()
            $('#luckysheet-modal-dialog-mask').show()
            $('#luckysheet-dataVerification-dialog').show()

            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){
                sheetmanage.changeSheetExec(formula.rangetosheet)
                formula.rangetosheet = null
            }

            let range = []
            selectionCopyShow(range)
        })
        $(document).off('click.dvRangeClose').on('click.dvRangeClose', '#luckysheet-dataVerificationRange-dialog-close', function(e) {
            $('#luckysheet-dataVerificationRange-dialog').hide()
            $('#luckysheet-modal-dialog-mask').show()
            $('#luckysheet-dataVerification-dialog').show()

            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){
                sheetmanage.changeSheetExec(formula.rangetosheet)
                formula.rangetosheet = null
            }

            let range = []
            selectionCopyShow(range)
        })
        $(document).on('click', '#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close', function(e) {
            $('#luckysheet-dataVerificationRange-dialog').hide()
            $('#luckysheet-modal-dialog-mask').show()
            $('#luckysheet-dataVerification-dialog').show()

            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){
                sheetmanage.changeSheetExec(formula.rangetosheet)
                formula.rangetosheet = null
            }

            let range = []
            selectionCopyShow(range)
        })

        //验证条件 下拉框
        $(document).off('change.typeSelect').on('change.typeSelect', '#data-verification-type-select', function(e) {
            $('#luckysheet-dataVerification-dialog .show-box .show-box-item').hide()

            let value = this.value
            let item = _this.curItem

            if(value == 'dropdown'){
                $('#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown').show()

                let value1 = ''

                if(value == item.type){
                    value1 = item.value1
                }

                $('#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1').val(value1)

                $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false)
            }
            else if(value == 'checkbox'){
                $('#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox').show()

                let value1 = ''
                let value2 = ''

                if(value == item.type){
                    value1 = item.value1
                    value2 = item.value2
                }

                $('#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1').val(value1)
                $('#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2').val(value2)
            }
            else if(value == 'number' || value == 'number_integer' || value == 'number_decimal'){
                $('#luckysheet-dataVerification-dialog .show-box-item-number').show()
                $('#luckysheet-dataVerification-dialog .show-box-item-number .input').hide()

                let type2 = 'bw'
                let value1 = ''
                let value2 = ''

                if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
                    type2 = item.type2
                    value1 = item.value1
                    value2 = item.value2
                }

                $('#luckysheet-dataVerification-dialog #data-verification-number-select').val(type2)

                if(type2 == 'bw' || type2 == 'nb'){
                    $('#luckysheet-dataVerification-dialog .show-box-item-number .input1').show()
                }
                else{
                    $('#luckysheet-dataVerification-dialog .show-box-item-number .input2').show()
                }

                $('#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1').val(value1)
                $('#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2').val(value2)
            }
            else if(value == 'text_content'){
                $('#luckysheet-dataVerification-dialog .show-box-item-text').show()

                let type2 = 'include'
                let value1 = ''

                if(value == item.type){
                    type2 = item.type2
                    value1 = item.value1
                }

                $('#luckysheet-dataVerification-dialog #data-verification-text-select').val(type2)
                $('#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1').val(value1)
            }
            else if(value == 'text_length'){
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength').show()
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input').hide()

                let type2 = 'bw'
                let value1 = ''
                let value2 = ''

                if(value == item.type){
                    type2 = item.type2
                    value1 = item.value1
                    value2 = item.value2
                }

                $('#luckysheet-dataVerification-dialog #data-verification-textLength-select').val(type2)

                if(type2 == 'bw' || type2 == 'nb'){
                    $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input1').show()
                }
                else{
                    $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input2').show()
                }

                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1').val(value1)
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2').val(value2)
            }
            else if(value == 'date'){
                $('#luckysheet-dataVerification-dialog .show-box-item-date').show()
                $('#luckysheet-dataVerification-dialog .show-box-item-date .input').hide()

                let type2 = 'bw'
                let value1 = ''
                let value2 = ''

                if(value == item.type){
                    type2 = item.type2
                    value1 = item.value1
                    value2 = item.value2
                }

                $('#luckysheet-dataVerification-dialog #data-verification-date-select').val(type2)

                if(type2 == 'bw' || type2 == 'nb'){
                    $('#luckysheet-dataVerification-dialog .show-box-item-date .input1').show()
                }
                else{
                    $('#luckysheet-dataVerification-dialog .show-box-item-date .input2').show()
                }

                $('#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1').val(value1)
                $('#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2').val(value2)
            }
            else if(value == 'validity'){
                $('#luckysheet-dataVerification-dialog .show-box .show-box-item-validity').show()

                let type2 = 'card'

                if(value == item.type){
                    type2 = item.type2
                }

                $('#luckysheet-dataVerification-dialog #data-verification-validity-select').val(type2)
            }
        })

        $(document).off('change.numberSelect').on('change.numberSelect', '#data-verification-number-select', function(e) {
            $('#luckysheet-dataVerification-dialog .show-box-item-number .input').hide()

            let value = this.value

            if(value == 'bw' || value == 'nb'){
                $('#luckysheet-dataVerification-dialog .show-box-item-number .input1').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .show-box-item-number .input2').show()
            }
        })
        // 文本长度选择变化
        $(document).off('change.textLengthSelect').on('change.textLengthSelect', '#data-verification-textLength-select', function(e) {
            $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input').hide()

            let value = this.value

            if(value == 'bw' || value == 'nb'){
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input1').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input2').show()
            }
        })

        $(document).off('change.dateSelect').on('change.dateSelect', '#data-verification-date-select', function(e) {
            $('#luckysheet-dataVerification-dialog .show-box-item-date .input').hide()

            let value = this.value

            if(value == 'bw' || value == 'nb'){
                $('#luckysheet-dataVerification-dialog .show-box-item-date .input1').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .show-box-item-date .input2').show()
            }
        })

        //选中单元格时显示提示语
        $(document).off('change.hintShow').on('change.hintShow', '#data-verification-hint-show', function(e) {
            if(this.checked){
                $('#luckysheet-dataVerification-dialog .data-verification-hint-text').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .data-verification-hint-text').hide()
            }
        })

        //确认按钮
        $(document).off('click.dvSaveConfirm').on('click.dvSaveConfirm', '#luckysheet-dataVerification-dialog-confirm', function(e) {
            let rangeTxt = $('#luckysheet-dataVerification-dialog #data-verification-range input').val().trim()
            let range = _this.getRangeByTxt(rangeTxt)

            if(range.length == 0){
                tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.selectCellRange2)
                return
            }

            let str = range[range.length - 1].row[0],
                edr = range[range.length - 1].row[1],
                stc = range[range.length - 1].column[0],
                edc = range[range.length - 1].column[1]
            let d = editor.deepCopyFlowData(Store.flowdata)

            if(str < 0){
                str = 0
            }

            if(edr > d.length - 1){
                edr = d.length - 1
            }

            if(stc < 0){
                stc = 0
            }

            if(edc > d[0].length - 1){
                edc = d[0].length - 1
            }

            let type = $('#luckysheet-dataVerification-dialog #data-verification-type-select').val()
            let type2 = null, value1 = '', value2 = ''

            if(type == 'dropdown'){
                value1 = $('#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1').val().trim()

                if(value1.length == 0){
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo1)
                    return
                }
                type2 = $('#luckysheet-dataVerification-dialog #data-verification-multi').is(':checked')
            }
            else if(type == 'checkbox'){
                value1 = $('#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1').val().trim()
                value2 = $('#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2').val().trim()

                if(value1.length == 0 || value2.length == 0){
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo2)
                    return
                }
            }
            else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){
                type2 = $('#luckysheet-dataVerification-dialog #data-verification-number-select').val()
                value1 = $('#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value1').val().trim()

                if(!isRealNum(value1)){
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                    return
                }

                if(type2 == 'bw' || type2 == 'nb'){
                    value2 = $('#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value2').val().trim()

                    if(!isRealNum(value2)){
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                        return
                    }

                    if(Number(value2) < Number(value1)){
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo4)
                        return
                    }
                }
            }
            else if(type == 'text_content'){
                type2 = $('#luckysheet-dataVerification-dialog #data-verification-text-select').val()
                value1 = $('#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1').val().trim()

                if(value1.length == 0){
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo5)
                    return
                }
            }
            else if(type == 'text_length'){
                type2 = $('#luckysheet-dataVerification-dialog #data-verification-textLength-select').val()
                value1 = $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value1').val().trim()

                if(!isRealNum(value1)){
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                    return
                }

                if (!Number.isInteger(Number(value1)) || Number(value1) < 0) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.textlengthInteger)
                    return
                }

                if(type2 == 'bw' || type2 == 'nb'){
                    value2 = $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value2').val().trim()

                    if(!isRealNum(value2)){
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                        return
                    }
                    if (!Number.isInteger(Number(value2)) || Number(value2) < 0) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.textlengthInteger)
                        return
                    }

                    if(Number(value2) < Number(value1)){
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo4)
                        return
                    }
                }
            }
            else if(type == 'date'){
                type2 = $('#luckysheet-dataVerification-dialog #data-verification-date-select').val()
                value1 = $('#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value1').val().trim()

                if(!isdatetime(value1)){
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo6)
                    return
                }

                if(type2 == 'bw' || type2 == 'nb'){
                    value2 = $('#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value2').val().trim()

                    if(!isdatetime(value2)){
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo6)
                        return
                    }

                    if(diff(value1, value2) > 0){
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo7)
                        return
                    }
                }
            }
            else if(type == 'validity'){
                type2 = $('#luckysheet-dataVerification-dialog #data-verification-validity-select').val()
            }

            let remote = $('#luckysheet-dataVerification-dialog #data-verification-remote').is(':checked')
            let prohibitInput = $('#luckysheet-dataVerification-dialog #data-verification-prohibitInput').is(':checked')
            let hintShow = $('#luckysheet-dataVerification-dialog #data-verification-hint-show').is(':checked')
            let hintText = ''

            if(hintShow){
                hintText = $('#luckysheet-dataVerification-dialog .data-verification-hint-text input').val().trim()
            }

            let item = {
                type: type,
                type2: type2,
                value1: value1,
                value2: value2,
                checked: false,
                remote: remote,
                prohibitInput: prohibitInput,
                hintShow: hintShow,
                hintText: hintText,
            }

            let historyDataVerification = $.extend(true, {}, _this.dataVerification)
            let currentDataVerification = $.extend(true, {}, _this.dataVerification)

            for(let r = str; r <= edr; r++){
                for(let c = stc; c <= edc; c++){
                    currentDataVerification[r + '_' + c] = item

                    if(type == 'checkbox'){
                        setcellvalue(r, c, d, item.value2)
                    }
                }
            }

            if(type == 'checkbox'){
                _this.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, d, range[range.length - 1])
            }
            else{
                _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex)
            }

            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-dataVerification-dialog').hide()
        })

        //删除验证按钮
        $(document).off('click.delete').on('click.delete', '#luckysheet-dataVerification-dialog-delete', function(e) {
            let rangeTxt = $('#luckysheet-dataVerification-dialog #data-verification-range input').val().trim()
            let range = _this.getRangeByTxt(rangeTxt)

            if(range.length == 0){
                tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.selectCellRange2)
                return
            }

            let historyDataVerification = $.extend(true, {}, _this.dataVerification)
            let currentDataVerification = $.extend(true, {}, _this.dataVerification)

            let str = range[range.length - 1].row[0],
                edr = range[range.length - 1].row[1],
                stc = range[range.length - 1].column[0],
                edc = range[range.length - 1].column[1]

            for(let r = str; r <= edr; r++){
                for(let c = stc; c <= edc; c++){
                    delete currentDataVerification[r + '_' + c]
                }
            }

            _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex)

            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-dataVerification-dialog').hide()
        })

        //info提示弹框 关闭
        $(document).on('click', '#luckysheet-info .luckysheet-modal-dialog-title-close, #luckysheet-info .luckysheet-model-close-btn', function(e) {
            $(this).parents('#luckysheet-info').hide()

            if($('#luckysheet-dataVerification-dialog').is(':visible')){
                $('#luckysheet-modal-dialog-mask').show()
            }
            e.stopPropagation()
        })
    },
    dataAllocation: function(){
        let _this = this

        //单元格范围
        let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
        let rangeTxt = getRangetxt(Store.currentSheetIndex, range, Store.currentSheetIndex)
        $('#luckysheet-dataVerification-dialog #data-verification-range input').val(rangeTxt)

        //focus单元格
        let rowIndex = range.row_focus || range.row[0]
        let colIndex = range.column_focus || range.column[0]
        let dataVerification = $.extend(true, {}, _this.dataVerification)
        let item = dataVerification[rowIndex + '_' + colIndex]

        if(item == null){
            item = $.extend(true, {}, _this.defaultItem)
        }

        _this.curItem = item

        //验证条件
        $('#luckysheet-dataVerification-dialog #data-verification-type-select').val(item.type)
        $('#luckysheet-dataVerification-dialog .show-box .show-box-item').hide()

        if(item.type == 'dropdown'){
            $('#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown').show()
            $('#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1').val(item.value1)
            $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false)
        }
        else if(item.type == 'checkbox'){
            $('#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox').show()
            $('#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1').val(item.value1)
            $('#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2').val(item.value2)
        }
        else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
            $('#luckysheet-dataVerification-dialog .show-box-item-number').show()
            $('#luckysheet-dataVerification-dialog #data-verification-number-select').val(item.type2)
            $('#luckysheet-dataVerification-dialog .show-box-item-number .input').hide()

            if(item.type2 == 'bw' || item.type2 == 'nb'){
                $('#luckysheet-dataVerification-dialog .show-box-item-number .input1').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .show-box-item-number .input2').show()
            }

            $('#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1').val(item.value1)
            $('#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2').val(item.value2)
        }
        else if(item.type == 'text_content'){
            $('#luckysheet-dataVerification-dialog .show-box-item-text').show()
            $('#luckysheet-dataVerification-dialog #data-verification-text-select').val(item.type2)
            $('#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1').val(item.value1)
        }
        else if(item.type == 'text_length'){
            $('#luckysheet-dataVerification-dialog .show-box-item-textLength').show()
            $('#luckysheet-dataVerification-dialog #data-verification-textLength-select').val(item.type2)
            $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input').hide()

            if(item.type2 == 'bw' || item.type2 == 'nb'){
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input1').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .show-box-item-textLength .input2').show()
            }

            $('#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1').val(item.value1)
            $('#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2').val(item.value2)
        }
        else if(item.type == 'date'){
            $('#luckysheet-dataVerification-dialog .show-box-item-date').show()
            $('#luckysheet-dataVerification-dialog #data-verification-date-select').val(item.type2)
            $('#luckysheet-dataVerification-dialog .show-box-item-date .input').hide()

            if(item.type2 == 'bw' || item.type2 == 'nb'){
                $('#luckysheet-dataVerification-dialog .show-box-item-date .input1').show()
            }
            else{
                $('#luckysheet-dataVerification-dialog .show-box-item-date .input2').show()
            }

            $('#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1').val(item.value1)
            $('#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2').val(item.value2)
        }
        else if(item.type == 'validity'){
            $('#luckysheet-dataVerification-dialog .show-box .show-box-item-validity').show()
            $('#luckysheet-dataVerification-dialog #data-verification-validity-select').val(item.type2)
        }

        //自动远程获取选项
        $('#luckysheet-dataVerification-dialog #data-verification-remote').prop('checked', item.remote)

        //输入数据无效时禁止输入
        $('#luckysheet-dataVerification-dialog #data-verification-prohibitInput').prop('checked', item.prohibitInput)

        //选中单元格时显示提示语
        $('#luckysheet-dataVerification-dialog #data-verification-hint-show').prop('checked', item.hintShow)

        if(item.hintShow){
            $('#luckysheet-dataVerification-dialog .data-verification-hint-text').show()
        }
        else{
            $('#luckysheet-dataVerification-dialog .data-verification-hint-text').hide()
        }

        $('#luckysheet-dataVerification-dialog .data-verification-hint-text input').val(item.hintText)
    },
    rangeDialog: function(dataSource, txt){
        let _this = this

        const _locale = locale()
        const dvText = _locale.dataVerification
        const buttonText = _locale.button

        $('#luckysheet-modal-dialog-mask').hide()
        $('#luckysheet-dataVerificationRange-dialog').remove()

        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-dataVerificationRange-dialog',
            'addclass': 'luckysheet-dataVerificationRange-dialog',
            'title': dvText.selectCellRange,
            'content': `<input readonly="readonly" placeholder="${dvText.selectCellRange2}" value="${txt}"/>`,
            'botton':  `<button id="luckysheet-dataVerificationRange-dialog-confirm" class="btn btn-primary" data-source="${dataSource}">${buttonText.confirm}</button>
                        <button id="luckysheet-dataVerificationRange-dialog-close" class="btn btn-default">${buttonText.close}</button>`,
            'style': 'z-index:100003'
        }))
        let $t = $('#luckysheet-dataVerificationRange-dialog')
                .find('.luckysheet-modal-dialog-content')
                .css('min-width', 300)
                .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $('#luckysheet-dataVerificationRange-dialog').css({
            'left': (winw + scrollLeft - myw) / 2,
            'top': (winh + scrollTop - myh) / 3
        }).show()
    },
    getTxtByRange: function(range){
        if(range.length > 0){
            let txt = []

            for(let s = 0; s < range.length; s++){
                let r1 = range[s].row[0], r2 = range[s].row[1]
                let c1 = range[s].column[0], c2 = range[s].column[1]

                txt.push(getRangetxt(Store.currentSheetIndex, { 'row': [r1, r2], 'column': [c1, c2] }, Store.currentSheetIndex))
            }

            return txt.join(',')
        }
    },
    getRangeByTxt: function(txt){
        let range = []

        if(txt.indexOf(',') != -1){
            let arr = txt.split(',')
            for(let i = 0; i < arr.length; i++){
                if(formula.iscelldata(arr[i])){
                    range.push(formula.getcellrange(arr[i]))
                }
                else{
                    range = []
                    break
                }
            }
        }
        else{
            if(formula.iscelldata(txt)){
                range.push(formula.getcellrange(txt))
            }
        }

        return range
    },
    cellFocus: function(r, c, clickMode){
        $('#luckysheet-dataVerification-dropdown-btn').hide()
        $('#luckysheet-dataVerification-showHintBox').hide()

        let _this = this

        if(_this.dataVerification == null || _this.dataVerification[r + '_' + c] == null){
            $('#luckysheet-dataVerification-dropdown-List').hide()
            return
        }

        let row = Store.visibledatarow[r],
            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1]
        let col = Store.visibledatacolumn[c],
            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, r, c)
        if(margeset){
            row = margeset.row[1]
            row_pre = margeset.row[0]

            col = margeset.column[1]
            col_pre = margeset.column[0]
        }

        let item = _this.dataVerification[r + '_' + c]

        //单元格数据验证 类型是 复选框
        if(clickMode && item.type == 'checkbox'){
            _this.checkboxChange(r, c)
            return
        }

        //单元格数据验证 类型是 下拉列表
        if(item.type == 'dropdown'){
            $('#luckysheet-dataVerification-dropdown-btn').show().css({
                'max-width': col - col_pre,
                'max-height': row - row_pre,
                'left': col - 20,
                'top': row_pre + (row - row_pre - 20) / 2
            })

            if($('#luckysheet-dataVerification-dropdown-List').is(':visible')){
                let dataIndex = $('#luckysheet-dataVerification-dropdown-List').prop('data-index')

                if(dataIndex != (r + '_' + c)){
                    $('#luckysheet-dataVerification-dropdown-List').hide()
                }
            }
        }
        else{
            $('#luckysheet-dataVerification-dropdown-List').hide()
        }

        //提示语
        if(item.hintShow){
            let hintText

            if(Store.lang == 'en'){
                hintText = '<span style="color:#f5a623;">Hint: </span>'
            }
            else{
                hintText = '<span style="color:#f5a623;">提示：</span>'
            }

            hintText += _this.getHintText(item)

            $('#luckysheet-dataVerification-showHintBox').html(hintText).show().css({
                'left': col_pre,
                'top': row
            })

            return
        }

        //数据验证未通过
        let cellValue = getcellvalue(r, c, null)

        if(isRealNull(cellValue)){
            return
        }

        let validate = _this.validateCellData(cellValue, item)

        if(!validate){
            let failureText

            if(Store.lang == 'en'){
                failureText = '<span style="color:#f72626;">Failure: </span>'
            }
            else{
                failureText = '<span style="color:#f72626;">失效：</span>'
            }

            failureText += _this.getFailureText(item)

            $('#luckysheet-dataVerification-showHintBox').html(failureText).show().css({
                'left': col_pre,
                'top': row
            })
        }
    },
    getHintText: function(item) {
        let _this = this

        let hintText = item.hintText || ''

        if(hintText.length == 0){
            if(Store.lang == 'en'){
                if(item.type == 'dropdown'){
                    hintText += 'please select an option in the drop-down list'
                }
                else if(item.type == 'checkbox'){

                }
                else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
                    hintText += 'please enter a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                    if(item.type2 == 'bw' || item.type2 == 'nb'){
                        hintText += ' and ' + item.value2
                    }
                }
                else if(item.type == 'text_content'){
                    hintText += 'please enter text ' + _this.optionLabel_en[item.type2] + ' ' + item.value1
                }
                else if(item.type == 'text_length'){
                    hintText += 'please enter text with length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                    if(item.type2 == 'bw' || item.type2 == 'nb'){
                        hintText += ' and ' + item.value2
                    }
                }
                else if(item.type == 'date'){
                    hintText += 'please enter a date ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                    if(item.type2 == 'bw' || item.type2 == 'nb'){
                        hintText += ' and ' + item.value2
                    }
                }
                else if(item.type == 'validity'){
                    hintText += 'please enter the correct ' + _this.optionLabel_en[item.type2]
                }
            }
            else{
                if(item.type == 'dropdown'){
                    hintText += '请选择下拉列表中的选项'
                }
                else if(item.type == 'checkbox'){

                }
                else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
                    hintText += '请输入' + _this.optionLabel[item.type2] + item.value1

                    if(item.type2 == 'bw' || item.type2 == 'nb'){
                        hintText += '和' + item.value2 + '之间'
                    }

                    hintText += '的' + _this.optionLabel[item.type]
                }
                else if(item.type == 'text_content'){
                    hintText += '请输入内容' + _this.optionLabel[item.type2] + item.value1 + '的文本'
                }
                else if(item.type == 'text_length'){
                    hintText += '请输入长度' + _this.optionLabel[item.type2] + item.value1

                    if(item.type2 == 'bw' || item.type2 == 'nb'){
                        hintText += '和' + item.value2 + '之间'
                    }

                    hintText += '的文本'
                }
                else if(item.type == 'date'){
                    hintText += '请输入' + _this.optionLabel[item.type2] + item.value1

                    if(item.type2 == 'bw' || item.type2 == 'nb'){
                        hintText += '和' + item.value2 + '之间'
                    }

                    hintText += '的日期'
                }
                else if(item.type == 'validity'){
                    hintText += '请输入正确的' + _this.optionLabel[item.type2]
                }
            }
        }

        return hintText
    },
    getFailureText: function(item) {
        let _this = this

        let failureText = ''

        if(Store.lang == 'en'){
            if(item.type == 'dropdown'){
                failureText += 'what you selected is not an option in the drop-down list'
            }
            else if(item.type == 'checkbox'){

            }
            else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
                failureText += 'what you entered is not a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                if(item.type2 == 'bw' || item.type2 == 'nb'){
                    failureText += ' and ' + item.value2
                }
            }
            else if(item.type == 'text_content'){
                failureText += 'what you entered is not text that ' + _this.optionLabel_en[item.type2] + ' ' + item.value1
            }
            else if(item.type == 'text_length'){
                failureText += 'the text you entered is not length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                if(item.type2 == 'bw' || item.type2 == 'nb'){
                    failureText += ' and ' + item.value2
                }
            }
            else if(item.type == 'date'){
                failureText += 'the date you entered is not ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                if(item.type2 == 'bw' || item.type2 == 'nb'){
                    failureText += ' and ' + item.value2
                }
            }
            else if(item.type == 'validity'){
                failureText += 'what you entered is not a correct ' + _this.optionLabel_en[item.type2]
            }
        }
        else{
            if(item.type == 'dropdown'){
                failureText += '你选择的不是下拉列表中的选项'
            }
            else if(item.type == 'checkbox'){

            }
            else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){
                failureText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1

                if(item.type2 == 'bw' || item.type2 == 'nb'){
                    failureText += '和' + item.value2 + '之间'
                }

                failureText += '的' + _this.optionLabel[item.type]
            }
            else if(item.type == 'text_content'){
                failureText += '你输入的不是内容' + _this.optionLabel[item.type2] + item.value1 + '的文本'
            }
            else if(item.type == 'text_length'){
                failureText += '你输入的不是长度' + _this.optionLabel[item.type2] + item.value1

                if(item.type2 == 'bw' || item.type2 == 'nb'){
                    failureText += '和' + item.value2 + '之间'
                }

                failureText += '的文本'
            }
            else if(item.type == 'date'){
                failureText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1

                if(item.type2 == 'bw' || item.type2 == 'nb'){
                    failureText += '和' + item.value2 + '之间'
                }

                failureText += '的日期'
            }
            else if(item.type == 'validity'){
                failureText += '你输入的不是一个正确的' + _this.optionLabel[item.type2]
            }
        }

        return failureText
    },
    validateCellData: function(cellValue, item){
        let _this = this

        let type = item.type,
            type2 = item.type2,
            value1 = item.value1,
            value2 = item.value2

        if(type == 'dropdown'){
            let list = _this.getDropdownList(value1)

            // 多选的情况 检查每个都在下拉列表中
            if(type2 && cellValue){
                return cellValue.split(',').every(function (i) {
                    return list.indexOf(i) !== -1
                })
            }

            let result = false

            for(let i = 0; i < list.length; i++){
                if(list[i] == cellValue){
                    result = true
                    break
                }
            }

            return result
        }
        else if(type == 'checkbox'){

        }
        else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){
            if(!isRealNum(cellValue)){
                return false
            }

            cellValue = Number(cellValue)

            if(type == 'number_integer' && cellValue % 1 !== 0){
                return false
            }

            if(type == 'number_decimal' && cellValue % 1 === 0){
                return false
            }

            value1 = Number(value1)
            value2 = Number(value2)

            if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){
                return false
            }

            if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){
                return false
            }

            if(type2 == 'eq' && cellValue != value1){
                return false
            }

            if(type2 == 'ne' && cellValue == value1){
                return false
            }

            if(type2 == 'gt' && cellValue <= value1){
                return false
            }

            if(type2 == 'lt' && cellValue >= value1){
                return false
            }

            if(type2 == 'gte' && cellValue < value1){
                return false
            }

            if(type2 == 'lte' && cellValue > value1){
                return false
            }
        }
        else if(type == 'text_content'){
            cellValue = cellValue.toString()
            value1 = value1.toString()

            if(type2 == 'include' && cellValue.indexOf(value1) == -1){
                return false
            }

            if(type2 == 'exclude' && cellValue.indexOf(value1) > -1){
                return false
            }

            if(type2 == 'equal' && cellValue != value1){
                return false
            }
        }
        else if(type == 'text_length'){
            cellValue = cellValue.toString().length

            value1 = Number(value1)
            value2 = Number(value2)

            if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){
                return false
            }

            if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){
                return false
            }

            if(type2 == 'eq' && cellValue != value1){
                return false
            }

            if(type2 == 'ne' && cellValue == value1){
                return false
            }

            if(type2 == 'gt' && cellValue <= value1){
                return false
            }

            if(type2 == 'lt' && cellValue >= value1){
                return false
            }

            if(type2 == 'gte' && cellValue < value1){
                return false
            }

            if(type2 == 'lte' && cellValue > value1){
                return false
            }
        }
        else if(type == 'date'){
            if(!isdatetime(cellValue)){
                return false
            }

            if(type2 == 'bw' && (diff(cellValue, value1) < 0 || diff(cellValue, value2) > 0)){
                return false
            }

            if(type2 == 'nb' && (diff(cellValue, value1) >= 0 && diff(cellValue, value2) <= 0)){
                return false
            }

            if(type2 == 'eq' && diff(cellValue, value1) != 0){
                return false
            }

            if(type2 == 'ne' && diff(cellValue, value1) == 0){
                return false
            }

            if(type2 == 'bf' && diff(cellValue, value1) >= 0){
                return false
            }

            if(type2 == 'nbf' && diff(cellValue, value1) < 0){
                return false
            }

            if(type2 == 'af' && diff(cellValue, value1) <= 0){
                return false
            }

            if(type2 == 'naf' && diff(cellValue, value1) > 0){
                return false
            }
        }
        else if(type == 'validity'){
            if(type2 == 'card' && !validateIdCard(cellValue)){
                return false
            }

            if(type2 == 'phone' && !/^1[3456789]\d{9}$/.test(cellValue)){
                return false
            }
        }

        return true
    },
    dropdownListShow: function(){
        $('#luckysheet-dataVerification-showHintBox').hide()

        let _this = this

        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
        let rowIndex = last.row_focus
        let colIndex = last.column_focus

        let row = Store.visibledatarow[rowIndex],
            row_pre = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1]
        let col = Store.visibledatacolumn[colIndex],
            col_pre = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex)
        if(margeset){
            row = margeset.row[1]
            row_pre = margeset.row[0]

            col = margeset.column[1]
            col_pre = margeset.column[0]
        }

        let item = _this.dataVerification[rowIndex + '_' + colIndex]
        let list = _this.getDropdownList(item.value1)

        let optionHtml = ''
        if (item.type === 'dropdown' && item.type2) {
            // 下拉多选的情况下 将已经选择的标出来
            let cellValue = getcellvalue(rowIndex, colIndex, null)
            let valueArr = isRealNull(cellValue) ? [] : cellValue.split(',')
            list.forEach(i => {
                let checked = valueArr.indexOf(i) !== -1
                optionHtml += `<div class="dropdown-List-item  luckysheet-mousedown-cancel multi${checked ? ' checked': ''}">${i}</div>`
            })
        } else {
            list.forEach(i => {
                optionHtml += `<div class="dropdown-List-item luckysheet-mousedown-cancel">${i}</div>`
            })
        }

        $('#luckysheet-dataVerification-dropdown-List')
        .html(optionHtml)
        .prop('data-index', rowIndex + '_' + colIndex)
        .show()
        .css({
            'width': col - col_pre - 1,
            'left': col_pre,
            'top': row,
        })

        let myh = $('#luckysheet-dataVerification-dropdown-List').outerHeight()
        let currentWinH = $('#luckysheet-cell-main')[0].scrollHeight

        if(row + myh > currentWinH - 42 - 6){
            $('#luckysheet-dataVerification-dropdown-List').css({
                'top': row_pre - myh,
            })
        }
    },
    getDropdownList: function(txt){
        let list = []

        if(formula.iscelldata(txt)){
            let range = formula.getcellrange(txt)
            let d = Store.luckysheetfile[getSheetIndex(range.sheetIndex)].data

            for(let r = range.row[0]; r <= range.row[1]; r++){
                for(let c = range.column[0]; c <= range.column[1]; c++){
                    if(d[r] == null){
                        continue
                    }

                    let cell = d[r][c]

                    if(cell == null || cell.v == null){
                        continue
                    }

                    let v = cell.m || cell.v

                    if(!list.includes(v)){
                        list.push(v)
                    }
                }
            }
        }
        else{
            let arr = txt.split(',')

            for(let i = 0; i < arr.length; i++){
                let v = arr[i]

                if(v.length == 0){
                    continue
                }

                if(!list.includes(v)){
                    list.push(v)
                }
            }
        }

        return list
    },
    checkboxChange: function(r, c){
        let _this = this

        let historyDataVerification = $.extend(true, {}, _this.dataVerification)
        let currentDataVerification = $.extend(true, {}, _this.dataVerification)

        let item = currentDataVerification[r + '_' + c]
        item.checked = !item.checked

        let value = item.value2
        if(item.checked){
            value = item.value1
        }

        let d = editor.deepCopyFlowData(Store.flowdata)
        setcellvalue(r, c, d, value)

        _this.refOfCheckbox(
            historyDataVerification,
            currentDataVerification,
            Store.currentSheetIndex,
            d,
            { 'row': [r, r], 'column': [c, c] }
        )
    },
    ref: function(historyDataVerification, currentDataVerification, sheetIndex){
        let _this = this

        if (Store.clearjfundo) {
            Store.jfundo.length  = 0

            let redo = {}
            redo['type'] = 'updateDataVerification'
            redo['sheetIndex'] = sheetIndex
            redo['historyDataVerification'] = historyDataVerification
            redo['currentDataVerification'] = currentDataVerification
            Store.jfredo.push(redo)
        }

        _this.dataVerification = currentDataVerification
        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification

        //共享编辑模式
        if(server.allowUpdate){
            server.saveParam('all', sheetIndex, currentDataVerification, { 'k': 'dataVerification' })
        }

        setTimeout(function () {
            luckysheetrefreshgrid()
        }, 1)
    },
    refOfCheckbox: function(historyDataVerification, currentDataVerification, sheetIndex, d, range){
        let _this = this

        if (Store.clearjfundo) {
            Store.jfundo.length  = 0

            let redo = {}
            redo['type'] = 'updateDataVerificationOfCheckbox'
            redo['sheetIndex'] = sheetIndex
            redo['historyDataVerification'] = historyDataVerification
            redo['currentDataVerification'] = currentDataVerification
            redo['data'] = Store.flowdata
            redo['curData'] = d
            redo['range'] = range
            Store.jfredo.push(redo)
        }

        _this.dataVerification = currentDataVerification
        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification

        Store.flowdata = d
        editor.webWorkerFlowDataCache(Store.flowdata)//worker存数据
        Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata

        //共享编辑模式
        if(server.allowUpdate){
            server.saveParam('all', sheetIndex, currentDataVerification, { 'k': 'dataVerification' })
            server.historyParam(Store.flowdata, sheetIndex, range)
        }

        setTimeout(function () {
            luckysheetrefreshgrid()
        }, 1)
    },
}

function validateIdCard(idCard) {
    // 15位和18位身份证号码的正则表达式
    var regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/

    // 如果通过该验证，说明身份证格式正确，但准确性还需计算
    if (regIdCard.test(idCard)) {
        if (idCard.length == 18) {
            var idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 将前17位加权因子保存在数组里
            var idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2] // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
            var idCardWiSum = 0 // 用来保存前17位各自乖以加权因子后的总和
            for (var i = 0; i < 17; i++) {
                idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]
            }

            var idCardMod = idCardWiSum % 11 // 计算出校验码所在数组的位置
            var idCardLast = idCard.substring(17) // 得到最后一位身份证号码

            // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
            if (idCardMod == 2) {
                if (idCardLast == 'X' || idCardLast == 'x') {
                    return true
                } else {
                    return false
                }
            } else {
                // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
                if (idCardLast == idCardY[idCardMod]) {
                    return true
                } else {
                    return false
                }
            }
        }
    } else {
        return false
    }
}

export default dataVerificationCtrl